#include "uart_obj.h"
#include "bsp_uart.h"
#include "user_uart_obj.h"

/*
    说明：
    串口中断模式接收范例，用户可参考该范例来修改
*/


#define UART3_RX_FIFO_DEEP UART_FIFO_SIZE_4
#define UART3_RX_FIFO_SINGLE_BUFF_SIZE 128

uart_obj_t uart_obj3 = {0};

uint8_t uart3_tx_buf[128] = {0};

uint8_t uart3_rx_fifo_buf[UART3_RX_FIFO_DEEP * UART3_RX_FIFO_SINGLE_BUFF_SIZE] = {0};

rx_fifo_manage_t uart3_rx_fifo_manage[UART3_RX_FIFO_DEEP] = {0};

void uart3_tx_port_cb(uint8_t *udata, uint16_t len);
void uart3_fifo_rx_cb(uint8_t *rdata, uint16_t len);
void uart3_fifo_rx_stop_cb(void);
void uart3_fifo_rx_start_cb(uint8_t *rx_data, uint16_t len);
uint8_t uart3_get_rx_one_byte_cb(uint8_t *rx_data);

//uint16_t cw32_uart3_get_dma_rx_current_cnt(void);



void mid_uart_obj_init(void)
{

    // 串口底层在main函数里初始化
    // 串口1对象初始化
		const uart_init_t uart_init = {

        //发送相关
        .tx_buf_addr     = uart3_tx_buf,
        .tx_buf_size     = sizeof(uart3_tx_buf),
        .uart_tx_port_cb = uart3_tx_port_cb,

        // 接收相关
        .rx_time_out_set         = 5,                                     // 接收超时时间，单位ms
        .rx_fifo_buf_base_addr   = uart3_rx_fifo_buf,                     // 接收缓冲区基地址
        .rx_fifo_buf_size_single = UART3_RX_FIFO_SINGLE_BUFF_SIZE,        // 单个缓冲区大小
        .rx_fifo_buf_size_total  = sizeof(uart3_rx_fifo_buf),             // 接收缓冲区总大小

        // 定义fifo rx 深度
        .rx_fifo_deep   = UART3_RX_FIFO_DEEP,          // 接收FIFO深度
        .rx_fifo_manage = uart3_rx_fifo_manage,        // 接收fifo管理结构体

        // fifo 接收回调函数
        .uart_fifo_rx_cb = uart3_fifo_rx_cb,

        // fifo 接收启停函数
        .uart_fifo_rx_stop_cb  = uart3_fifo_rx_stop_cb,
        .uart_fifo_rx_start_cb = uart3_fifo_rx_start_cb,

        // 单字节中断接口
        .uart_get_rx_one_byte_cb = uart3_get_rx_one_byte_cb,
    };
    uart_obj_it_init(&uart_obj3,&uart_init);


}

void uart3_tx_port_cb(uint8_t *udata, uint16_t len)
{
	// 调用bsp层接口
	cw32_uart3_send_data(udata,len);
}

void uart3_fifo_rx_cb(uint8_t *rdata, uint16_t len)
{
	// //将接收到的数据发出
	uart_obj_tx_bin_data(&uart_obj3, rdata, len);

}

void uart3_fifo_rx_stop_cb(void)
{
    UART_ITConfig(CW_UART3, UART_IT_RC, DISABLE);
    UART_ClearITPendingBit(CW_UART3, UART_IT_RC);        // 清除标志位
}

void uart3_fifo_rx_start_cb(uint8_t *rx_data, uint16_t len)
{
    UART_ITConfig(CW_UART3, UART_IT_RC, ENABLE);
    UART_ClearITPendingBit(CW_UART3, UART_IT_RC);        // 清除标志位
}

uint8_t uart3_get_rx_one_byte_cb(uint8_t *rx_data)
{
	// 直接操作寄存器提高效率
    if (REGBITS_GET(CW_UART3->ISR, UART_IT_RC) == 0)
    {
        return 0;
    }
    REGBITS_CLR(CW_UART3->ICR, UART_IT_RC);
    *rx_data = CW_UART3->RDR;
    return 1;
}

/*--------------------------------------------------需要对外调用的函数----------------------------------------------------------------*/

void task_uart3_it_rx_byte_irq(void)
{
    uart_obj_it_rx_byte_irq(&uart_obj3);
}

void task_uart3_rx_frame_break(void)
{
    uart_obj_it_rx_frame_break(&uart_obj3);
}

void task_uart3_rx_fifo_read(void)
{
    uart_obj_rx_fifo_read(&uart_obj3);
}
